Task 1: Data extraction

import pandas as pd
# import countypres dataset
countypres= pd.read_csv("./data/countypres_2000-2016.csv")
# select democrat party
democrat=countypres[countypres["party"]=="democrat"]
# select year from 2008
democrat=democrat[democrat["year"]>=2008]
# apply FIPS to GEOID column
democrat['GEOID'] = democrat['FIPS'].apply(lambda x: '{0:0>5}'.format(x))
# count percentage
democrat["percent"]=democrat['candidatevotes']/democrat['totalvotes']
# store democrat data to csv for future use
democrat=democrat[["year","state","state_po","county","GEOID","percent"]]
democrat.to_csv("democrat.csv",index=False)
# similar to unemployment data
# first, extract sheet "unemployment_med" from the xls file
# and store it as csv
unemploy = pd.read_csv("./data/Unemployment_Med.csv")
# rename FIPStxt to GEOID column
unemploy=unemploy.rename(columns = {"FIPStxt":"GEOID"})
unemploy['GEOID'] = unemploy['GEOID'].apply(lambda x: '{0:0>5}'.format(x))
# extract county name and state 
unemploy[["county","state_po"]]=unemploy.area_name.str.split(",",expand=True)
# store unemployment data to csv for future use
unemploy=unemploy[["county","state_po","GEOID","Unemployment_rate_2008","Unemployment_rate_2012","Unemployment_rate_2016"]]
unemploy.to_csv("unemploy.csv",index=False)

Task 2: Create choropleths

# load us county map
us <- read_sf("./data/tl_2019_us_county-1/tl_2019_us_county.shp")
# load previously extracted data
democrat <- read_csv('democrat.csv')
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   year = col_double(),
##   state = col_character(),
##   state_po = col_character(),
##   county = col_character(),
##   GEOID = col_double(),
##   percent = col_double()
## )
## Warning: 9 parsing failures.
##  row   col               expected actual           file
## 3115 GEOID no trailing characters  00nan 'democrat.csv'
## 3116 GEOID no trailing characters  00nan 'democrat.csv'
## 3117 GEOID no trailing characters  00nan 'democrat.csv'
## 6232 GEOID no trailing characters  00nan 'democrat.csv'
## 6233 GEOID no trailing characters  00nan 'democrat.csv'
## .... ..... ...................... ...... ..............
## See problems(...) for more details.
unemploy <- read_csv('unemploy.csv')
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   county = col_character(),
##   state_po = col_character(),
##   GEOID = col_character(),
##   Unemployment_rate_2008 = col_double(),
##   Unemployment_rate_2012 = col_double(),
##   Unemployment_rate_2016 = col_double()
## )

Pennsylvania

# extract Penn's rows with STATEFP 48
penn_map <- us[us$STATEFP %in% c("42"),]
democrat$GEOID <- formatC(democrat$GEOID, width = 5, format = "d", flag = "0")
# merge Penn unemployment rate and democrat party information 
penn<-merge(penn_map,unemploy,by=c("GEOID"))
penn<-merge(penn,democrat,by=c("GEOID"))
# year 2008
pa_2008 <- penn[which(penn$year==2008),]
# year 2012
pa_2012<- penn[which(penn$year==2012),]
# year 2016
pa_2016 <- penn[which(penn$year==2016),]
# 2008 Pennsylvania Democratic Vote Percentage
title_13 <- tags$p(tags$style("p {font-size:12px}"), 
                tags$b("2008 Pennsylvania Democratic Vote Percentage"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2008$county.x, 
                    "<br><strong>Percent of Vote: </strong>", 
                    paste(round(100*pa_2008$percent, 2), "%", sep=""))

pal<-colorQuantile("Blues", NULL, n = 10)

map_13 <- leaflet(data = pa_2008,
                 options = leafletOptions(attributionControl=FALSE)) %>%
  addTiles()%>% 
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(percent), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
  addLegend("bottomleft", pal = pal, values = ~percent,
            title = "Percent of Vote", 
            opacity = 0.6)%>%
  addControl(title_13, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors
#map_13
# 2008 Pennsylvania Unemployment Rate
title_14 <- tags$p(tags$style("p {font-size:12px}"),
                  tags$b("2008 Pennsylvania Unemployment Rate"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2008$county.x, 
                    "<br><strong>Unemployment Rate: </strong>", 
                    pa_2008$Unemployment_rate_2008)

pal<-colorQuantile("Oranges", NULL, n = 10)

map_14 <- leaflet(data = pa_2008,options = leafletOptions(
            attributionControl=FALSE)) %>%
  
  addTiles() %>%
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(Unemployment_rate_2008), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
  addLegend("bottomleft", pal = pal, values = ~Unemployment_rate_2008,
            title = "Unemployment Rate",
            opacity = 0.6)%>%
 
  addControl(title_14, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Oranges is 9
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Oranges is 9
## Returning the palette you asked for with that many colors
#map_14
# 2012 Pennsylvania Democratic Vote Percentage
title_15 <- tags$p(tags$style("p {font-size:12px}"), 
                tags$b("2012 Pennsylvania Democratic Vote Percentage"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2012$county.x, 
                    "<br><strong>Percent of Vote: </strong>", 
                    paste(round(100*pa_2012$percent, 2), "%", sep=""))

pal<-colorQuantile("Blues", NULL, n = 10)

map_15 <- leaflet(data = pa_2012,
                 options = leafletOptions(attributionControl=FALSE)) %>%
  addTiles()%>% 
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(percent), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
 # addLegend("bottomleft", pal = pal, values = ~percent,
           # title = "Percent of Vote", 
           # opacity = 0.8)%>%
  addControl(title_15, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors
#map_15
# 2012 Pennsylvania Unemployment Rate
title_16 <- tags$p(tags$style("p {font-size:12px}"),
                  tags$b("2012 Pennsylvania Unemployment Rate"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2012$county.x, 
                    "<br><strong>Unemployment Rate: </strong>", 
                    pa_2012$Unemployment_rate_2012)

pal<-colorQuantile("Oranges", NULL, n = 10)

map_16 <- leaflet(data = pa_2012,options = leafletOptions(
            attributionControl=FALSE)) %>%
  
  addTiles() %>%
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(Unemployment_rate_2012), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
 # addLegend("bottomleft", pal = pal, values = ~Unemployment_rate_2012,
           # title = "Unemployment Rate",
           # opacity = 0.8)%>%
 
  addControl(title_16, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Oranges is 9
## Returning the palette you asked for with that many colors
#map_16
# 2016 Pennsylvania Democratic Vote Percentage
title_17 <- tags$p(tags$style("p {font-size:12px}"), 
                tags$b("2016 Pennsylvania Democratic Vote Percentage"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2016$county.x, 
                    "<br><strong>Percent of Vote: </strong>", 
                    paste(round(100*pa_2016$percent, 2), "%", sep=""))

pal<-colorQuantile("Blues", NULL, n = 10)

map_17 <- leaflet(data = pa_2016,
                 options = leafletOptions(attributionControl=FALSE)) %>%
  addTiles()%>% 
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(percent), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
  #addLegend("bottomleft", pal = pal, values = ~percent,
          #  title = "Percent of Vote", 
          #  opacity = 0.8)%>%
  addControl(title_17, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Blues is 9
## Returning the palette you asked for with that many colors
#map_17
# 2016 Pennsylvania Unemployment Rate
title_18 <- tags$p(tags$style("p {font-size:12px}"),
                  tags$b("2016 Pennsylvania Unemployment Rate"))

popup_dat <- paste0("<strong>County: </strong>", 
                    pa_2016$county.x, 
                    "<br><strong>Unemployment Rate: </strong>", 
                    pa_2016$Unemployment_rate_2016)

pal<-colorQuantile("Oranges", NULL, n = 10)

map_18 <- leaflet(data = pa_2016,options = leafletOptions(
            attributionControl=FALSE)) %>%
  
  addTiles() %>%
  setView(lng = -80, lat = 40, zoom = 5) %>% 
  addPolygons(fillColor = ~pal(Unemployment_rate_2016), 
              fillOpacity = 1, 
              color = "#BDBDC3", 
              weight = 1,
              popup = popup_dat
              ) %>%
  #addLegend("bottomleft", pal = pal, values = ~Unemployment_rate_2016,
            #title = "Unemployment Rate",
            #opacity = 0.8)%>%
 
  addControl(title_18, position = "topright" )%>%
  addProviderTiles(providers$CartoDB.Positron)
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'
## Warning in RColorBrewer::brewer.pal(max(3, n), palette): n too large, allowed maximum for palette Oranges is 9
## Returning the palette you asked for with that many colors
#map_18
sync(list(map_13, map_15, map_17, map_14, map_16, map_18),ncol=3)